레벨이 업그레이드되는 사용자에게는 안내 메일을 발송해달라는 새로운 요청사항이 들어왔다.

JavaMail을 이용한 메일 발송 기능

JavaMail 메일 발송

JavaMail이 포함된 코드의 테스트

테스트를 하면서 매번 메일이 발송되는 것이 바람직한 가에 대해 상각해 보자. 실제 DB 대신에 테스트 DB를 사용하듯이 테스트 때는 메일 서버 설정을 다르게 해서 테스트용으로 따로 준비된 메일 서버를 이용하는 방법은 어떤가? 해야할 일은 단지, 테스트 가능한 메일 서버까지만 잘 전송이 되는지 확인하면 된다.

테스트를 위한 서비스 추상화

실제 메일 전송을 수행하는 JavaMail 대신에 테스트에서 사용할, JavaMail과 같은 인터페이스를 갖는 오브젝트를 만들어서 사용하면 문제는 해결된다.

JavaMail을 이용한 테스트의 문제점

하지만 JavaMail은 확장이나 지원이 불가능하도록 만들어진 가장 악명 높은 표준 API 중의 하나로 알려져 있다. 구현을 바꿔치기할 만한 인터페이스의 존재가 보이지 않는다.

이때에 서비스 추상화를 적용하여 문제를 해결해 보자. 스프링은 JavaMail을 사용해 만든 코드는 손쉽게 테스트하기 힘들다는 문제를 해결하기 위해 JavaMail에 대한 추상화 기능을 제공하고 있다.

메일 발송 기능 추상화

테스트 대역

의존 오브젝트의 변경을 통한 테스트 방법

테스트 대상인 오브젝트가 의존 오브젝트를 갖고 있기 때문에 발생하는 문제점이 있다.
바로 간단한 오브젝트의 코드를 테스트하는 데 너무 거창한 작업이 뒤따르는 경우다. 이는 테스트를 위해 간단한 환경을 만들어주던가, 아예 아무런 일도 하지 않는 빈 오브젝트로 대치해주는 것이 해결책이다.

테스트 대역의 종류와 특징

이렇게 테스트용으로 사용되는 특별한 오브젝트들이 있다. 대부분 테스트 대상인 오브젝트의 의존 오브젝트가되는 것들이다. 자주 테스트를 실행할 수 있도록 사용하는 이런 오브젝트들을 통틀어서 테스트 대역 이라고 부른다.

대표적으로 테스트 스텁 이라는 것이 있는데, 테스트 대상 오브젝트의 의존객체로서 존재하면서 테스트 동안에 코드가 정상적으로 수행할 수 있도록 돕는 것을 말한다.

테스트 스텁 : 테스트가 수행될 수 있도록 의존 오브젝트에 간접적으로 입력 값을 제공해줌

목 오브젝트 : 간접적인 출력 값까지 확인이 가능함. 테스트 대상으로부터 전달받은 정보를 검증할 수 있도록 설계된 것.